/*
 * @lc app=leetcode.cn id=101 lang=cpp
 *
 * [101] 对称二叉树
 *
 * https://leetcode.cn/problems/symmetric-tree/description/
 *
 * algorithms
 * Easy (59.62%)
 * Likes:    2633
 * Dislikes: 0
 * Total Accepted:    965.8K
 * Total Submissions: 1.6M
 * Testcase Example:  '[1,2,2,3,4,4,3]'
 *
 * 给你一个二叉树的根节点 root ， 检查它是否轴对称。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 
 * 输入：root = [1,2,2,3,4,4,3]
 * 输出：true
 * 
 * 
 * 示例 2：
 * 
 * 
 * 输入：root = [1,2,2,null,3,null,3]
 * 输出：false
 * 
 * 
 * 
 * 
 * 提示：
 * 
 * 
 * 树中节点数目在范围 [1, 1000] 内
 * -100 <= Node.val <= 100
 * 
 * 
 * 
 * 
 * 进阶：你可以运用递归和迭代两种方法解决这个问题吗？
 * 
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == nullptr)
            return false;

        std::stack<TreeNode*> nodes;
        nodes.push(root->left);
        nodes.push(root->right);

        while (!nodes.empty()) {
            auto right = nodes.top();
            nodes.pop();

            auto left = nodes.top();
            nodes.pop();

            if (left == nullptr && right == nullptr)
                continue;

            if ((left == nullptr && right != nullptr) ||
                (left != nullptr && right == nullptr) ||
                (left->val != right->val))
                return false;

            //对称节点入栈

            nodes.push(left->left);     //      left            right
            nodes.push(right->right);   //  ->left                 ->right

            nodes.push(left->right);    //      left            right
            nodes.push(right->left);    //        ->right   ->left
        }

        return true;
    }
};
// @lc code=end

